Technote 1127

In Search of...
...Missing Links*

(*íçÅgÉXÉ^Å[ÉgÉåÉbÉNÅhÇΔÇÕä÷åWdžÇËÇ‹ÇπÇÒÅB)


ñ⁄éü

ñ‚ëË: åáóéÉãÅ[É`Éì

âåàçÙ: ÉOÉãÅ[ÇèëÇ≠

ä»íPÇ»ÉTÉìÉvÉã

ÉåÉWÉXÉ^ÉxÅ[ÉXÇà A ÉgÉâÉbÉv

ÉåÉWÉXÉ^Ç≈ÉfÉBÉXÉpÉbÉ`Ç≥ÇÍÇÈ
A ÉgÉâÉbÉv

ÉXÉ^ÉbÉNÇ≈ÉfÉBÉXÉpÉbÉ`Ç≥ÇÍÇÈ
A ÉgÉâÉbÉv

é¿ç€ÇÃÉTÉìÉvÉã

äÆëSÇ»ÉTÉìÉvÉã: HFS+

äÆëSÇ»ÉTÉìÉvÉã: ControlStrip

äÆëSÇ»ÉTÉìÉvÉã: Power Manager

óvñÒ

Åué∏ÇÌÇÍÇΩÉäÉìÉNÅvÇÕÇ¢ÇΩÇÈèäÇ…ë∂ç›ÇµÇ‹Ç∑ÅBCFM ÉAÉvÉäÉPÅ[ÉVÉáÉìÇèëǢǃǢǃÅAFlushCodeCacheRange ÇåƒÇ—èoÇ∑ÇΔÇ´ÅAÉRÉìÉgÉçÅ[ÉãÉXÉgÉäÉbÉvÇï\é¶Ç∑ÇÈÇΔÇ´ÅAâBÇ∑ÇΔÇ´ÅACursor Device ManagerÇégǧÇΔÇ´ÅAìØÇ∂ñ‚ëËÇ…îYÇ‹Ç≥ÇÍÇ‹Ç∑ÅBǪÇÍÇ™Åué∏ÇÌÇÍÇΩÉäÉìÉNÅvÇ≈Ç∑ÅBDZÇÍÇÁÇà API (Application Programming Interfaces) ÇÕÇ‹Çæ InterfaceLib Ç…é¿ëïÇ≥ÇÍǃǢNjÇπÇÒÅBǪÇÍÇ≈ÇÕǫǧǵÇΩÇÁÇÊÇ¢ÇÃÇ≈ǵÇÂǧǩÅBDZÇà TECHNOTE Ç…ÇÕÅué∏ÇÌÇÍÇΩÉäÉìÉNÅvÇÃèCïúï˚ñ@Ç™ãLç⁄Ç≥ÇÍǃǢNjÇ∑ÅBDZÇÍÇÕÅAÉNÉâÉVÉbÉN 68K ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ©ÇÁ CFM ÉãÅ[É`ÉìÇåƒÇ—èoÇ∑ï˚ñ@DžǬǢǃèëÇ©ÇÍÇΩÅuTECHNOTE 1077ÅvÇÃë±ï“Ç≈Ç∑ÅBDZÇà TECHNOTE Ç≈ÇÕÅAÉNÉâÉVÉbÉN 68K Çà A ÉgÉâÉbÉvÉãÅ[É`ÉìÇåƒÇ—èoÇ∑ CFM ÉOÉãÅ[ÉRÅ[ÉhÇÃèëÇ´ï˚Çê‡ñæÇµÇ‹Ç∑ÅB

DZÇà TECHNOTE ÇÕÅAÉNÉâÉVÉbÉN 68K Çà API ÇÃíÜÇ≈ÅAåªç› InterfaceLib Ç©ÇÁåáóéǵǃǢÇÈ API ÇégópÇ∑ÇÈÉfÉxÉçÉbÉpÇëŒè€Ç…èëÇ©ÇÍǃǢNjÇ∑ÅB

åxçê: DZÇÍÇÕè„ãâé“å¸ÇØÇÃÉgÉsÉbÉNÇ≈ÅAAPI Ç™åáóéǵǃǢÇÈÇΩÇflÇ…äJî≠Çë±çsÇ≈ǴǻǢÉfÉxÉçÉbÉpÇ™égǧLJÇÃÇ≈Ç∑ÅBÉAÉbÉvÉãÇÕÅADZÇà TECHNOTE ÇÃÉäÉäÅ[ÉXå„LJÅAé∏ÇÌÇÍÇΩÉäÉìÉNÇå©Ç¬ÇØÇƒ InterfaceLib Ç…í«â¡Ç∑ÇÈìwóÕÇë±ÇØÇƒÇ¢Ç´Ç‹Ç∑ÅB


ñ‚ëË: åáóéÉãÅ[É`Éì

ÉNÉâÉVÉbÉN 68K Çà API ÇÃÇ¢Ç≠ǬǩÇÕ PowerPC Ç®ÇÊÇ— CFM-68K Çà InterfaceLib Ç…ä‹Ç‹ÇÍǃǢNjÇπÇÒÅBǪǧǵÇΩÉãÅ[É`ÉìÇ CFM ÉRÅ[ÉhÇ©ÇÁåƒÇ—èoÇ∑ÇΔÅAÉvÉçÉOÉâÉÄÇÃÉäÉìÉNéûÇ…ÅuÉVÉìÉ{ÉãÇ™âåàÇ≈ǴǻǢÅvÇΔǢǧÉGÉâÅ[Ç™î≠ê∂ǵNjÇ∑ÅB

Å@

âåàçÙ: ÉOÉãÅ[ÇèëÇ≠

DZÇà TECHNOTE Ç≈íÒãüÇ∑ÇÈÇÃÇÕàÍéûìIÇ»âåàçÙÇ≈ÅAÉvÉçÉOÉâÉÄÇ…ÉCÉìÉNÉãÅ[ÉhÇ≈Ç´ÇÈÉOÉãÅ[ÉRÅ[ÉhÇÃçÏê¨ï˚ñ@Çê‡ñæÇµÇ‹Ç∑ÅBåáóéǵÇΩ API ǪÇÍǺÇÍDžǬǢǃ 1 ǬÇ∏ǬÉOÉãÅ[ÉãÅ[É`ÉìÇèëÇ≠ïKóvǙdžÇËÇ‹Ç∑ÅBäeÉãÅ[É`ÉìÇÕ 68K A ÉgÉâÉbÉvÇÃÉAÉhÉåÉXÇåàíËǵÅAìKêÿÇ»ÉpÉâÉÅÅ[É^ÇéwíËǵǃÅACallUniversalProc Ç© CallOSTrapUniversalProc ÇåƒÇ—èoǵNjÇ∑ÅBè´óàåáóéǵǃǢÇÈ API Çä‹ÇfiêVǵǢ InterfaceLib ÉtÉ@ÉCÉãÇ™ÉäÉäÅ[ÉXÇ≥ÇÍÇΩÇÁÅAÉOÉãÅ[ÉtÉ@ÉCÉãǻǵÇ≈ÉvÉçÉWÉFÉNÉgÇÉrÉãÉhǵíºÇ∑DZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB

Å@

ä»íPÇ»ÉTÉìÉvÉã (îÒèÌÇ…ä»íPÇ» 4 ó·)

íçà”: éüÇà 4 ǬÇà API ÇÕåáóé API Ç≈ÇÕÇ»Ç≠ÅAÇøÇ·ÇÒÇΔ InterfaceLib Ç…ì¸Ç¡ÇƒÇ¢Ç‹Ç∑ÅBä»íPÇ»ó·Çé¶Ç∑ñ⁄ìIÇ≈éÊÇËè„Ç∞NjǵÇΩÅB

<MacWindows.h> Ç…ÇÕ InitWindowsÅASelectWindowÅAFrontWindowÅACheckUpdate Ç™éüÇÃÇÊǧDžíËã`Ç≥ÇÍǃǢNjÇ∑ÅB

extern pascal void InitWindows(void)
	ONEWORDINLINE(0xA912);
Å@
extern pascal void SelectWindow(WindowPtr's theWindow)
	ONEWORDINLINE(0xA91F);
Å@
extern pascal WindowPtr FrontWindow(void)
	ONEWORDINLINE(0xA924);
Å@
extern pascal Boolean CheckUpdate(EventRecord *theEvent)
	ONEWORDINLINE(0xA911);
InitWindows ÇÃèÍçáÅAéüÇÃÇÊǧDž A ÉgÉâÉbÉvÇÃÉAÉhÉåÉXÇΔ Pascal å^Çà ProcInfo ÇéwíËǵǃ CallUniversalProc ÇåƒÇ—èoǵNjÇ∑ÅB

pascal void InitWindows(void)
// ONEWORDINLINE(0xA912);
{
	CallUniversalProc(GetToolboxTrapAddress(0xA912),
		kPascalStackBased);
}
ǪÇÍÇŸÇ«ÇfiÇ∏ǩǵÇ≠džÇËÇ‹ÇπÇÒÇ≈ǵÇΩÇÀÅBGetToolboxTrapAddress Çà 0xA912 ǙǫDZǩÇÁóàǃǢÇÈÇ©ÇÌÇ©ÇÁǻǢï˚ÇÃÇΩÇflÇ…ÅAǪÇÍÇÕ ONEWORDINLINE É}ÉNÉçDždžÇËÇ‹Ç∑ÅB<Traps.h> ÇÃíÜÇ©ÇÁíTÇ∑DZÇΔLJÇ≈Ç´Ç‹Ç∑ÅBÇ≥džÅAéüÇÕÉpÉâÉÅÅ[É^ÇìnÇ∑ó·Ç≈Ç∑ÅB

extern pascal void SelectWindow(WindowPtr theWindow)
// ONEWORDINLINE(0xA91F);
{
	CallUniversalProc(GetToolboxTrapAddress(0xA91F),
		kPascalStackBased |
			STACK_ROUTINE_PARAMETER(1,SIZE_CODE(sizeof(WindowPtr))),
		theWindow	// the parameter
	);
}
âΩLJÇfiÇ∏ǩǵǢDZÇΔÇÕdžÇËÇ‹ÇπÇÒÅBprocinfo Ç… STACK_ROUTINE_PARAMETER É}ÉNÉçÇâ¡Ç¶ÅAÉpÉâÉÅÅ[É^Çí«â¡ÇµÇ‹ÇµÇΩÅBéüÇÕílÇï‘Ç∑ó·Ç≈Ç∑ÅB

extern pascal WindowPtr FrontWindow(void)
// ONEWORDINLINE(0xA924);
{
	return (WindowPtr) CallUniversalProc(
		GetToolboxTrapAddress(0xA924),
		kPascalStackBased |
			RESULT_SIZE(SIZE_CODE(sizeof(WindowPtr)))
	);
}
DZÇÍÇÕ RESULT_SIZE É}ÉNÉçÇégǡǃÅAÉXÉ^ÉbÉNè„ÇÃåãâ ÇÃÉTÉCÉYÇíËã`ǵNjÇ∑ÅBCallUniversalProc Ç™ï‘Ç∑ long Ç WindowPtr Ç…å^ïœä∑ǵǻÇ≠ǃÇÕÇ»ÇÁǻǢDZÇΔÇ…íçà”ǵǃÇ≠ÇæÇ≥Ç¢ÅBÇ≥ǃÅADZDZNjÇ≈äwèKǵÇΩDZÇΔÇëgÇ›çáÇÌÇπǃǛNjǵÇÂǧÅBéüÇÕÅAÉpÉâÉÅÅ[É^Ç™ 1 å¬Ç≈ÅAílÇï‘Ç∑ API Ç≈Ç∑ÅB

extern pascal Boolean CheckUpdate(EventRecord *theEvent)
// ONEWORDINLINE(0xA911);
{
	return (Boolean) CallUniversalProc(
		GetToolboxTrapAddress(0xA911),
		kPascalStackBased |
			RESULT_SIZE(SIZE_CODE(sizeof(Boolean))) |
			STACK_ROUTINE_PARAMETER(1,SIZE_CODE(sizeof(EventRecord*)))
	);
}

ÉåÉWÉXÉ^ÉxÅ[ÉXÇà A ÉgÉâÉbÉv

ÉIÉyÉåÅ[ÉeÉBÉìÉOÉVÉXÉeÉÄÇ÷Çà A ÉgÉâÉbÉvÇÕÉpÉâÉÅÅ[É^ÇÉåÉWÉXÉ^Ç≈ìnǵNjÇ∑ÅBÉAÉbÉvÉãÇÕç≈ãfl PBXGetVolInfo (PBX ÇÃÅuXÅvÇ…íçñ⁄) Çà A ÉgÉâÉbÉvÇì±ì¸ÇµÇ‹ÇµÇΩÅBDZÇÍÇÕ PBGetVolInfo ÇÃÇÊǧDžìÆçÏǵNjÇ∑Ç™ÅAêVÇΩÇ…ëÂóeó É{ÉäÉÖÅ[ÉÄèÓïÒÇï‘Ç∑DZÇΔÇ™Ç≈Ç´ÇÈÇÊǧDžǻÇËNjǵÇΩÅBCFM Ç©ÇÁÇÕéüÇÃÇÊǧDžǵǃåƒÇ—èoÇ∑DZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB

// åxçê: DZÇÃÉRÅ[ÉhÇÕégÇÌǻǢÇÊǧDž - å„ë±ÇÃÉZÉNÉVÉáÉìÇì«ÇÒÇ≈Ç≠ÇæÇ≥Ç¢ÅB
//#pragma parameter __D0 PBXGetVolInfoSync(__A0)
pascal OSErr PBXGetVolInfoSync(XVolumeParamPtr paramBlock)
// TWOWORDINLINE(0x7012, 0xA060);
{
	return (OSErr) CallOSTrapUniversalProc(
		(UniversalProcPtr) GetOSTrapAddress(0xA060),
		kRegisterBased |
			RESULT_SIZE(SIZE_CODE(sizeof(OSErr))) |
			REGISTER_RESULT_LOCATION(kRegisterD0) |
			REGISTER_ROUTINE_PARAMETER(1, kRegisterD0,
				kTwoByteCode) |	// selector
			REGISTER_ROUTINE_PARAMETER(2, kRegisterA0,
				SIZE_CODE(sizeof(XVolumeParamPtr*))),
		0x0012,	// selector
		paramBlock);	// parameter(s)
}
// åxçê: DZÇÃÉRÅ[ÉhÇÕégÇÌǻǢÇÊǧDž - å„ë±ÇÃÉZÉNÉVÉáÉìÇì«ÇÒÇ≈Ç≠ÇæÇ≥Ç¢ÅB
ç≈èâÇ…íçñ⁄ǵǃǟǵǢÇÃÇÕÅACallUniversalProc Ç≈ÇÕÇ»Ç≠ÅACallOSTrapUniversalProc ÇégópǵǃǢÇÈDZÇΔÇ≈Ç∑ÅBCallOSTrapUniversalProc ä÷êîÇÕÅAOS Çà A ÉgÉâÉbÉvÇé¿çsÇ∑ÇÈïWèÄìIÇ»åƒÇ—èoǵï˚ñ@DžǵÇΩǙǡǃÅAéwíËÇÃÉÜÉjÉoÅ[ÉTÉãÉvÉçÉVÅ[ÉWÉÉÉ|ÉCÉìÉ^Ç…ëŒâûÇ∑ÇÈÉãÅ[É`ÉìÇé¿çsǵNjÇ∑ÅBA1ÅAA2ÅAD1ÅAD2 ÇÃÉåÉWÉXÉ^ÇÕÉãÅ[É`ÉìÇ™é¿çsÇ≥ÇÍÇÈëOÇ…ï€ë∂Ç≥ÇÍÅAé¿çsäÆóπå„Ç…ïúå≥Ç≥ÇÍÇ‹Ç∑ÅBÇ≥ÇÁÇ…ÅAÉgÉâÉbÉvÉèÅ[Éhì‡ÇÃÉtÉâÉOÉrÉbÉgÇ™ê›íËÇ≥ÇÍǃǢÇÈÇΩÇflÅAÉåÉWÉXÉ^ A0 LJï€ë∂ïúå≥Ç≥ÇÍÇ‹Ç∑ÅB

ÉZÉåÉNÉ^ (0x0012) ÇÕÇ«ÇÃÇÊǧDžåàíËǵÇΩÇÃÇ≈ǵÇÂǧǩÅBMacsBug Ç≈ TWOWORDINLINE Çà 16 êiÉRÅ[ÉhÇÉfÉBÉXÉAÉZÉìÉuÉãÇ∑ÇÈÇΔÅAéüÇÃÇÊǧDžǻÇËÇ‹Ç∑ÅB

MacsBug> dh 7012 A060
	MOVEQ	#$12,D0
	_FSDispatch
åÎâǵǻǢÇ≈Ç≠ÇæÇ≥Ç¢ÅBAPI ÇΔ xWORDINLINE ÇÃèÓïÒÇÕ Universal Interface Ç©ÇÁíºê⁄ÉRÉsÅ[ǵǃǢNjÇ∑ÅBDZÇÃèÍçáÇÕ pragma ÉpÉâÉÅÅ[É^Çå©ÇÈÇΔÅAÇ«ÇÃÉåÉWÉXÉ^ǙǫDZÇ≈égÇÌÇÍǃǢÇÈǩǙÇÌÇ©ÇËÇ‹Ç∑ (OSErr ÇÕ DO Ç…ÅAXVolumeParamPtr ÉpÉâÉÅÅ[É^ÇÕ A0)ÅBêÊÇÃèÍçáÇÃÇÊǧDžÅAxWORDINLINE É}ÉNÉçÇÉfÉBÉXÉAÉZÉìÉuÉãÇ∑ÇÈÇΔÅAÉZÉåÉNÉ^èÓïÒÇΔ A ÉgÉâÉbÉvÇ™ìæÇÁÇÍÇ‹Ç∑ÅBProcInfo Ç… kD0DispatchedRegisterBased ÇÃåƒÇ—èoǵãKë•ÇÕǻǢÇÃÇ≈ÅADO ÉZÉåÉNÉ^LJëºÇÃÉåÉWÉXÉ^ÉxÅ[ÉXÇÃÉpÉâÉÅÅ[É^ÇΔìØÇ∂ÇÊǧDžèàóùÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅB

Å@

GetToolboxTrapAddress ÇÃë„ÇÌÇËÇ… GetOSTrapAddress ÇégǡǃǢÇÈDZÇΔÇ…íçñ⁄ǵǃÇ≠ÇæÇ≥Ç¢ÅBDZÇÍÇ…ÇÊǡǃï ÇÃñ‚ëËÇ™î≠ê∂ǵNjÇ∑ÅBOS Çà A ÉgÉâÉbÉvÇ…ÇÕÅAA ÉgÉâÉbÉvÇÃÉrÉbÉg 9 ÇΔÉrÉbÉg 10 Ç≈ÉtÉâÉOÇìnÇ∑LJÇÃǙdžÇÈÇÃÇ≈Ç∑ÅBó·Ç¶ÇŒÅAéüÇà NewPrt Çå©ÇƒÇ≠ÇæÇ≥Ç¢ÅB

	_NewPtr = 0xA11E
	_NewPtrSys  = 0xA51E
	_NewPtrClear= 0xA31E
	_NewPtrSysClear = 0xA71E
ǬNjÇËÅAÉrÉbÉg 9 ÇÕ 'Sys' ÉrÉbÉgÇ≈ÅAÉrÉbÉg 10 ÇÕ 'Clear' ÉrÉbÉgÇ≈džÇÈDZÇΔÇ™ÇÌÇ©ÇËÇ‹Ç∑ÅBDZÇÍÇÁ 4 ǬÇà A ÉgÉâÉbÉvÇÕÅAíPìΔÇÃÉfÉBÉXÉpÉbÉ`ÉÉÅ[Çí Ç∂ǃèàóùÇ≥ÇÍÅAÉtÉâÉOÉrÉbÉgÇ≈Ç«ÇÃÉãÅ[É`ÉìÇåƒÇ—èoÇ∑ǩǙåàÇ‹ÇËÇ‹Ç∑ÅBÇ≤ë∂Ç∂Ç≈Ç∑Ç©ÅBPBXGetVolInfoSync (0xA060) Çà A ÉgÉâÉbÉvLJìØólÇ≈Ç∑ÅB

	_FSDispatch	  = 0xA060
	_HFSDispatch	 = 0xA260
	_FSDispatchAsync  = 0xA460
	_HFSDispatchAsync = 0xA660
Trap Manager ÇÃè⁄ç◊DžǬǢǃÇÕÅAÅwInside Macintosh: Operating Systems UtilitiesÅxÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB

ǪÇÍÇ≈ÇÕÅAA ÉgÉâÉbÉvÉfÉBÉXÉpÉbÉ`ÉÉÅ[ÇÕÅAÇ«Çà A ÉgÉâÉbÉvÇåƒÇ—èoÇ∑ÇÃÇ©ÇǫǧǵǃîªífÇ∑ÇÈÇÃÇ≈ǵÇÂǧǩÅBA ÉgÉâÉbÉvÇÕ D1 ÉåÉWÉXÉ^Ç≈ìnǵNjÇ∑ÅBÇ≈Ç∑Ç©ÇÁÅAè„ãLÇà PBXGetVolInfoSync ÇÃÉOÉãÅ[ÇèCê≥Ç∑ÇÈÇ…ÇÕÅAD1 ÉåÉWÉXÉ^Ç≈ A ÉgÉâÉbÉvÇìnÇ∑DZÇΔÇ Mixed Mode Manager Ç…ì`ǶÇÈï ÇÃÉpÉâÉÅÅ[É^Çí«â¡Ç∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅB

íçà”: DZDZÇ≈ÇÕèáèòÇ™ÇΩÇ¢Ç÷ÇÒèdóvÇ≈Ç∑ÅBCFM ÉOÉãÅ[Ç™ CFM ÉRÅ[ÉhÇ≈ÉpÉbÉ`Ç≥ÇÍÇΩÉgÉâÉbÉvÇåƒÇ—èoǵǃǢǃÅAProcInfo ÉpÉâÉÅÅ[É^ÇÃèáèòÇ™ìØÇ∂Ç≈ǻǩǡÇΩÇÁÅAǪÇÃÉpÉbÉ`ÇÕå≥ÇÃÉpÉâÉÅÅ[É^ÇÃèáî‘Ç≈åƒÇ—èoÇ≥ÇÍÇ‹Ç∑ÅBê≥ãKÇÃèáèòÇÕÅAÉZÉåÉNÉ^ (ïKóvÇ»èÍçá)ÅAD1 (A ÉgÉâÉbÉv)ÅAçÇãâåæåÍÇÃÉvÉçÉgÉ^ÉCÉvÇ…åªÇÍÇÈèáèòÇ≈ï¿ÇÒÇæÉpÉâÉÅÅ[É^Ç≈Ç∑ÅB

pascal OSErr PBXGetVolInfoSync(XVolumeParamPtr paramBlock)
// TWOWORDINLINE(0x7012, 0xA060);
{
	return (OSErr) CallOSTrapUniversalProc (
		(UniversalProcPtr) GetOSTrapAddress(0xA060),
		kRegisterBased |
			RESULT_SIZE(SIZE_CODE(sizeof(OSErr))) |
			REGISTER_RESULT_LOCATION(kRegisterD0) |
			REGISTER_ROUTINE_PARAMETER(1, kRegisterD0,
				kTwoByteCode) |	// selector
			REGISTER_ROUTINE_PARAMETER(2, kRegisterD1,
				kTwoByteCode) |	// A-Trap
			REGISTER_ROUTINE_PARAMETER(3, kRegisterA0,
				SIZE_CODE(sizeof(XVolumeParamPtr*))),
		0x0012,		// selector
		0xA060,		// A-Trap
		paramBlock);	// parameter(s)
}

ÉåÉWÉXÉ^Ç≈ÉfÉBÉXÉpÉbÉ`Ç≥ÇÍÇÈ A ÉgÉâÉbÉv

ÉåÉWÉXÉ^Ç≈ÉfÉBÉXÉpÉbÉ`Ç≥ÇÍÇÈ A ÉgÉâÉbÉvÇ≈ÇÕÅAÉZÉåÉNÉ^ÇÉåÉWÉXÉ^ D0 Ç‹ÇΩÇÕ D1 ÇÃÇ¢Ç∏ÇÍÇ©Ç≈ìnÇ∑ïKóvǙdžÇËÇ‹Ç∑ÅBéüÇ…é¶Ç∑ÇÃÇÕÅAç≈ãflÇ‹Ç≈ CFM-68K Çà InterfaceLib Ç©ÇÁåáóéǵǃǢÇΩ AppleGuide API Ç≈Ç∑ÅB

pascal AGErr AGGeneral(AGRefNum refNum, AGEvent theEvent)
// TWOWORDINLINE(0x700D, 0xAA6E);
{
	return (AGErr) CallUniversalProc(GetToolboxTrapAddress(0xAA6E),
		kD0DispatchedPascalStackBased |
			RESULT_SIZE(SIZE_CODE(sizeof(AGErr))) |
			DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kTwoByteCode) |
			DISPATCHED_STACK_ROUTINE_PARAMETER(1,
				SIZE_CODE(sizeof(refNum))) |
			DISPATCHED_STACK_ROUTINE_PARAMETER(2,
				SIZE_CODE(sizeof(theEvent))),
		0x000D,		// selector -> D0
		refNum,theEvent	// the parameters
	);
}
DZÇÃÉRÅ[ÉhÇ≈ç≈èâÇ…íçñ⁄ǵǃǟǵǢÇÃÇÕÉZÉåÉNÉ^ (0x0012) Ç≈Ç∑ÅBTWOWORDINLINE É}ÉNÉçÇ©ÇÁ MacsBug Ç≈ílÇéÊìæÇ∑ÇÈÅAéüÇÃï˚ñ@ÇäoǶǃǮǢǃÇ≠ÇæÇ≥Ç¢ÅB

MacsBug> dh 700D AA6E
	MOVEQ	#$0D,D0
	_AGGeneral
DZDZǩÇÁÅADZÇà API Ç™ D0 Ç≈ÉfÉBÉXÉpÉbÉ`Ç≥ÇÍÇÈDZÇΔÇ™ófiêÑÇ≈Ç´Ç‹Ç∑ÅBÇ≥ǃÅADISPATCHED_STACK_ROUTINE_SELECTOR_SIZE Ç…égópÇ∑ÇÈê≥ǵǢílÇÕÅAÇ«ÇÃÇÊǧDžǵǃí≤Ç◊ÇΩÇÁÇÊÇ¢ÇÃÇ≈ǵÇÂǧǩÅBLJǧàÍìxÅAéüÇÃÇÊǧDžǵǃ MacsBug Ç≈ÅA_AppleGuideDispatch Çà A ÉgÉâÉbÉvÇí Ç∂ǃÉfÉBÉXÉpÉbÉ`Ç≥ÇÍÇÈ API ÇÃÉäÉXÉgÇéÊìæÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB

MacsBug> api AA6E
Å@
	° AA6E _AppleGuideDispatch
		DO.W=0001		AGOpen
		DO.W=0002		AGOpenWithSearch
		DO.W=0003		AGOpenWithSequence
		<...>
DZÇÃåãâ Ç©ÇÁÅAÉZÉåÉNÉ^ÇÕé¿ç€Ç…ÇÕÉèÅ[ÉhÉxÅ[ÉXÇæÇΔǢǧDZÇΔÇ™ÇÌÇ©ÇËÇ‹Ç∑ÅBÇ≈Ç∑Ç©ÇÁÅADISPATCHED_STACK_ROUTINE_SELECTOR_SIZE Ç…ÇÕ kTwoByteCode ÇΔǢǧílÇéwíËǵNjÇ∑ÅB

Å@

ÉXÉ^ÉbÉNÇ≈ÉfÉBÉXÉpÉbÉ`Ç≥ÇÍÇÈ A ÉgÉâÉbÉv

ÉXÉ^ÉbÉNÇ≈ÉfÉBÉXÉpÉbÉ`Ç≥ÇÍÇÈ A ÉgÉâÉbÉvÇ…ÇÕÅAÉXÉ^ÉbÉNÇ≈ÉZÉåÉNÉ^ÇìnÇ∑ïKóvǙdžÇËÇ‹Ç∑ÅBTEGetPoint ÇÕ InterfaceLib Ç…ä‹Ç‹ÇÍǃǢNjÇ∑Ç™ÅADZDZÇ≈ÇÕDZÇÍÇó·ÇΔǵǃéÿÇËǃÅAíçà”ì_Çê‡ñæÇµÇ‹Ç∑ÅB

	
// åxçê: DZÇÃÉRÅ[ÉhÇÕégÇÌǻǢÇÊǧDž - å„ë±ÇÃíióéÇì«ÇÒÇ≈Ç≠ÇæÇ≥Ç¢ÅB
	
static Point TEGetPoint(short offset,TEHandle hTE)
{
// THREEWORDINLINE(0x3F3C, 0x0008, 0xA83D);
// MOVE.W	#$0008,-(A7)
//		_TEDispatch
// _TEGetPoint is A83D (_TEDispatch) when A7^.W=0008
// A7^.W=0008 ÇÃÇΔÇ´ _TEGetPoint ÇÕ A83D (_TEDispatch)
	return (Point) CallUniversalProc(
		GetToolboxTrapAddress(_TEDispatch),	// ÉfÉBÉXÉpÉbÉ`ÉÉÅ[ÇÃÉAÉhÉåÉX
		kStackDispatchedPascalStackBased |		// proc info
			RESULT_SIZE(SIZE_CODE(sizeof(Point))) |
			DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kTwoByteCode) |
			DISPATCHED_STACK_ROUTINE_PARAMETER(1,
				SIZE_CODE(sizeof(short))) |
			DISPATCHED_STACK_ROUTINE_PARAMETER(2,
				SIZE_CODE(sizeof(TEHandle))),
		0x0008,	// selector -> stack
		offset, hTE	// parameter(s)
	);
}
// åxçê: DZÇÃÉRÅ[ÉhÇÕégÇÌǻǢÇÊǧDž - å„ë±ÇÃíióéÇì«ÇÒÇ≈Ç≠ÇæÇ≥Ç¢ÅB
ç°ìxÇÕÅAÉZÉåÉNÉ^ÇÕÉXÉ^ÉbÉNè„ÇÃÉèÅ[ÉhÇΔǵǃìnÇ≥ÇÍÇ‹Ç∑ÅBÇ®ÇÌÇ©ÇËÇ≈Ç∑Ç©ÅBÇæÇ¢ÇΩÇ¢ÇÌÇ©ÇËÇ‹Ç∑ÇÀÅBDZÇÍÇÕà¯Ç¡Ç©ÇØÇÃéøñ‚Ç≈ÅAÇfiÇ∏ǩǵǢÇΔDZÇÎÇ‹Ç≈îÚnjǵǃǵNjǮǧÇΔÇ∑ÇÈêlÇ…íçà”Çä´ãNÇ∑ÇÈÇΩÇflÇ≈Ç∑ÅBTEGetPoint ÇÕ Point Çï‘ǵNjÇ∑ÅBñ‚ëËÇÕdžÇËÇ‹ÇπÇÒÅBǪÇÍÇÕå^ïœä∑Ç∑ÇÍÇŒÇÊÇ¢ÇÃÇ≈Ç∑ÅBǂǡǃǛǃÇ≠ÇæÇ≥Ç¢ÅBǮǡÇΔÅAÉqÉÖÅ[ÉXÉgÉìÅAñ‚ëËÇ™ãNDZǡÇΩÅBÉRÉìÉpÉCÉâÇ™ÅuÉGÉâÅ[: ñæé¶ìIÇ»å^ïœä∑Ç™ïsê≥ - 'long' Ç©ÇÁ 'struct Point'ÅvÇΔï∂ãÂÇåæÇ¡ÇƒÇ¢Ç‹Ç∑ÅBDZÇÍÇâÒîÇ∑ÇÈÇ…ÇÕÅAåãâ ÇÉçÅ[ÉJÉãïœêîÇ…ï€ä«ÇµÅAǪÇÃÉAÉhÉåÉXÇ Point Ç÷ÇÃÉ|ÉCÉìÉ^Ç…å^ïœä∑ǵǻÇ≠ǃÇÕÇ»ÇËÇ‹ÇπÇÒÅBǪǵǃÅAéüÇÃÇÊǧDžÅAÉ|ÉCÉìÉ^Ç©ÇÁílÇéÊÇËèoǵǃê≥ämÇ»åãâ ÇìæÇ‹Ç∑ÅB

static Point TEGetPoint(short offset,TEHandle hTE)
{
// THREEWORDINLINE(0x3F3C, 0x0008, 0xA83D);
// MOVE.W	#$0008,-(A7)
//		_TEDispatch
// _TEGetPoint is A83D (_TEDispatch) when A7^.W=0008
// A7^.W=0008 ÇÃÇΔÇ´ _TEGetPoint ÇÕ A83D (_TEDispatch)
	long private_results = CallUniversalProc(
		GetToolboxTrapAddress(_TEDispatch),	// ÉfÉBÉXÉpÉbÉ`ÉÉÅ[ÇÃÉAÉhÉåÉX
		kStackDispatchedPascalStackBased |	// proc info
			RESULT_SIZE(SIZE_CODE(sizeof(Point))) |
			DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kTwoByteCode) |
			DISPATCHED_STACK_ROUTINE_PARAMETER(1,
				SIZE_CODE(sizeof(short))) |
			DISPATCHED_STACK_ROUTINE_PARAMETER(2,
				SIZE_CODE(sizeof(TEHandle))),
		0x0008,		// selector
		offset, hTE	// parameter(s)
	);
	return *(Point*) &private_results;
}
ç\ë¢ëÃÇÃÉTÉCÉYÇ™ 4 ÉoÉCÉgÇÃèÍçáÇÕDZÇÍÇ≈Ç∑Ç◊ǃǧNjÇ≠ǢǴNjÇ∑ÅBǵǩǵÅA4 ÉoÉCÉgÇÊÇËè¨Ç≥Ç¢èÍçáÇÕǫǧǻÇÈÇÃÇ≈ǵÇÂǧÅBéüÇÃÉTÉìÉvÉãÇééǵǃÇ≠ÇæÇ≥Ç¢ÅB

typedef struct CryptoCharsRecord {
	char	findChar;
	char	replaceChar;
} CryptoCharsRec, *CryptoCharsPtr, **CryptoCharsHdl;
CallUniversalProc Ç©ÇÁï‘Ç≥ÇÍÇÈDZÇÃç\ë¢ëÃÇ long ÇÃåãâ Ç…ï€ë∂Ç∑ÇÈèÍçáÅAéüÇÃÇÊǧDžǻÇËÇ‹Ç∑ (Mac OS ÇÕè„à ÉoÉCÉgÇêÊÇ…ÅAâ∫à ÉoÉCÉgÇå„Ç…ï€ë∂Ç∑ÇÈDZÇΔÇévÇ¢èoǵǃÇ≠ÇæÇ≥Ç¢)ÅB

+---------------------------+
Low Mem | 0 | <-- private_result ÇÃÉAÉhÉåÉX
+---------------------------+
| 1 |
+---------------------------+
| 2 |	findChar
+---------------------------+
High Mem| 3 |	replaceChar
+---------------------------+
DZÇÃèÍçáÅAíPèÉÇ»å^ïœä∑LJÉ|ÉCÉìÉ^Ç©ÇÁéÊÇËèoǵÇΩílÇÃå^ïœä∑LJǧNjÇ≠ǢǴNjÇπÇÒÅBÇ‚ÇËÇ©ÇΩÇÕÅAåãâ ÇÃÉAÉhÉåÉXÇ…è„à ÉèÅ[ÉhÇ÷ÇÃÉIÉtÉZÉbÉgÇâ¡Ç¶ÇΩLJÇÃÇ©ÇÁílÇéÊÇËèoǵNjÇ∑ÅB

pascal CryptoCharsRec GetEncodeKey(char* pThePassword)
{
	long private_results = CallUniversalProc(
		GetToolboxTrapAddress(0xAxxx),
		kPascalStackBased |
			RESULT_SIZE(SIZE_CODE(sizeof(Boolean))) |
			STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(EventRecord*)))
		theEvent	// the parameter
	);
	return *(((CryptoCharsRec*)&private_result) + 1);
}
àÍå©ÇµÇƒÅAÉIÉtÉZÉbÉgÇ™ 2 Ç≈Ç»ÇØÇÍnjǻÇÁǻǢÇΔévǧǩLJǵÇÍÇ‹ÇπÇÒÇ™ÅADZÇÃèÍçáÇÕÉoÉCÉgÇÃÉIÉtÉZÉbÉgÇ≈Ç»Ç≠ÅA2 ÉoÉCÉgÇÃç\ë¢ëÃÇÃÉIÉtÉZÉbÉgÇæÇΔǢǧDZÇΔÇévÇ¢èoǵǃÇ≠ÇæÇ≥Ç¢ÅBC åæåÍÇÕDZÇÃDZÇΔÇîFéØÇµÇƒÇ®ÇËÅA1 Ç≈ÇÕÇ»Ç≠ 2 Çâ¡éZǵNjÇ∑ÅBDZǧǵÇΩÉIÉtÉZÉbÉgÇÃåvéZÇÕîÒèÌÇ…ä‘à·Ç¢Ç‚Ç∑Ç¢ÇÃÇ≈ÅAïœêîÇ‹ÇΩÇÕïœêîå^Ç™ó^ǶÇÁÇÍÇΩèÍçáÇ…ÉIÉtÉZÉbÉgÇåvéZÇ∑ÇÈÉ}ÉNÉçÇDZDZDžè–âÓǵǃǮǴNjÇ∑ÅB

#define RESULT_OFFSET(type) \
	((sizeof(type) == 1) ? 3 : ((sizeof(type) == 2) ? 1 : 0))
âΩLJÇfiÇ∏ǩǵǢDZÇΔÇÕdžÇËÇ‹ÇπÇÒÅBç\ë¢ëÃÇÃÉTÉCÉYÇ™ 1 ÇæÇ¡ÇΩÇÁÅAè„à ÉoÉCÉgÇ÷ÇÃÉIÉtÉZÉbÉgÅA3 (ÉoÉCÉg) Ç…Ç»ÇËÇ‹Ç∑ÅBç\ë¢ëÃÇÃÉTÉCÉYÇ™ 2 ÇæÇ¡ÇΩÇÁÅAè„à ÉèÅ[ÉhÇ÷ÇÃÉIÉtÉZÉbÉgÅA1 (ÉèÅ[Éh) Ç…Ç»ÇËÇ‹Ç∑ÅBDZÇÃÇ¢Ç∏ÇÍÇ≈Ç‡Ç»ÇØÇÍÇŒÉIÉtÉZÉbÉgÇÕÉ[ÉçÇ≈Ç∑ÅBDZÇÍÇÕéüÇÃÇÊǧDžégópǵNjÇ∑ÅB

pascal CryptoCharsRec Get_Encode_Key(char* pThePassword)
{
	long private_results = CallUniversalProc(
		GetToolboxTrapAddress(0xA911),
		kPascalStackBased |
			RESULT_SIZE(SIZE_CODE(sizeof(Boolean))) |
			STACK_ROUTINE_PARAMETER(1,
				SIZE_CODE(sizeof(EventRecord*)))
		theEvent	// the parameter
	);
	return *(((CryptoCharsRec*)&private_result) +
		RESULT_OFFSET(CryptoCharsRec));
}
Ç®ÇÌÇ©ÇËÇ≈Ç∑Ç©ÅBÇ≈ÇÕÅAåãâ Ç™ 4 ÉoÉCÉgÇÊÇËLJëÂǴǩǡÇΩÇÁǫǧǻÇÈÇ≈ǵÇÂǧǩÅBDZÇÃèÍçáÅACallUniversalProc ÇégópǵǃÉãÅ[É`ÉìÇåƒÇ—èoÇ∑DZÇΔÇÕÇ≈Ç´Ç‹ÇπÇÒÅBéÑÇ™å©ÇΩ (É}ÉVÉìÇ™ê∂ê¨ÇµÇΩ) ÉOÉãÅ[ÉRÅ[ÉhÇ…ÇÕÅAéüÇÃÇÊǧDžÅAåãâ Ç™ CallUniversalProc ÇÃèàóùâ¬î\Ç»ÉTÉCÉYÇÊÇËLJëÂǴǢǩǫǧǩÉeÉXÉgÇ∑ÇÈLJÇÃǙdžÇËNjǵÇΩÅB

#ifdef applec
	#if sizeof(OSErr) > 4
		#error "Result types larger than 4 bytes are not supported."
	#endif
#endif

é¿ç€ÇÃÉTÉìÉvÉã

é¿ç€Ç… InterfaceLib Ç©ÇÁåáóéǵǃǢÇÈ API ÇÇ¢Ç≠Ǭǩå©ÇƒÇ›Ç‹ÇµÇÂǧÅBÇ‹Ç∏ÅACursor Device Manager Çà API Ç≈Ç∑ÅB

pascal OSErr CursorDeviceMoveTo(CursorDevicePtr ourDevice, long absX, long absY)
{
//	TWOWORDINLINE(0x7001, 0xAADB);
//	MOVEQ	#$01,D0		| 7001
//	_CursorDeviceDispatch	| AADB
	return (OSErr) CallUniversalProc(
		(UniversalProcPtr)GetToolboxTrapAddress(0xAADB),
		kD0DispatchedPascalStackBased |
		RESULT_SIZE(SIZE_CODE(sizeof(OSErr))) |
		DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kFourByteCode) |
		DISPATCHED_STACK_ROUTINE_PARAMETER(1,
			SIZE_CODE(sizeof(ourDevice))) |
		DISPATCHED_STACK_ROUTINE_PARAMETER(2,
			SIZE_CODE(sizeof(absX))) |
		DISPATCHED_STACK_ROUTINE_PARAMETER(3,
			SIZE_CODE(sizeof(absY))),
	0x00000001,				// selector
	ourDevice, absX, absY);	// parameter(s)
}
éüÇÕ OSUtils.h ÇÃåáóé API Ç≈Ç∑ÅB

static pascal OSErr FlushCodeCacheRange(void *address, unsigned long count)
{
//  TWOWORDINLINE(0x7009, 0xA098);
//  MOVEQ  #$09,D0| 7009
//  _HWPriv  | A098
	return (OSErr) CallOSTrapUniversalProc(
		GetOSTrapAddress(_HWPriv),
		kRegisterBased
			| RESULT_SIZE (SIZE_CODE (sizeof (OSErr)))
			| REGISTER_RESULT_LOCATION (kRegisterD0)
			| REGISTER_ROUTINE_PARAMETER(1,kRegisterA0,
				SIZE_CODE(sizeof(address)))
			| REGISTER_ROUTINE_PARAMETER(2,kRegisterA1,
				SIZE_CODE(sizeof(count)))
		address,count);	// parameter(s)
}
éüÇà API ÇÕ InterfaceLib DžLJÉwÉbÉ_DžLJdžÇËÇ‹ÇπÇÒ (DZDZNjÇ≈ì«ÇÒÇ≈Ç≠ÇæÇ≥Ç¡ÇΩï˚Ç÷ÇÃÇ®óÁÇÃà”ñ°ÇDZÇflǃ)ÅB

pascal ComponentResult TVSetFrequency(TVTunerComponent ci, long frequency)
//FIVEWORDINLINE(0x2F3C, 0x04, kSelectTVSetFrequency, 0x7000, 0xA82A);
//		MOVE.L	#$00040001,-(A7)
//		MOVEQ	#$00,D0
//		_ComponentDispatch
{
	return (ComponentResult) CallUniversalProc(
		(UniversalProcPtr) GetToolboxTrapAddress(0xA82A),
		kD0DispatchedPascalStackBased |
			RESULT_SIZE(SIZE_CODE(sizeof(ComponentResult))) |
			DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kTwoByteCode) |
			DISPATCHED_STACK_ROUTINE_PARAMETER( 1,
				SIZE_CODE(sizeof(long))) |
			DISPATCHED_STACK_ROUTINE_PARAMETER( 2,
				SIZE_CODE(sizeof(TVTunerComponent))) |
			DISPATCHED_STACK_ROUTINE_PARAMETER( 3,
				SIZE_CODE(sizeof(long))),
		0x0000,		// D0 selector
		0x00040001,	// Stack dispatched selector
		ci, frequency);	// parameter(s)
}

äÆëSÇ»ÉTÉìÉvÉã: HFS+

HFS+ópÇà eXtended DiskInit ÉãÅ[É`ÉìÇÃäÆëSÇ»ÉOÉãÅ[ÉtÉ@ÉCÉãÇéüÇ…åfç⁄ǵNjÇ∑ÅB

/*
	File:		DiskInit.Glue.c
Å@
	Copyright:	© 1984-1997 by Apple Computer, Inc.
				All rights reserved.
*/
Å@
#include <DiskInit.h>
#include <MixedMode.h>
Å@
static UniversalProcPtr gPack2TrapUPP = kUnresolvedCFragSymbolAddress;
static UniversalProcPtr gUnimplementedUPP = kUnresolvedCFragSymbolAddress;
Å@
pascal OSErr DIXFormat(short drvNum, Boolean fmtFlag, 
				unsigned long fmtArg, unsigned long *actSize)
// THREEWORDINLINE(0x700C, 0x3F00, 0xA9E9);
//		MOVEQ	#$0C,D0	| 700C
//		MOVE.W	D0,-(A7)	| 3F00
//		_Pack2			| A9E9
{
	long	private_result = unimpErr;	// ñ¢é¿ëïÇà A ÉgÉâÉbÉvÇâºíË
Å@
	if ((Ptr) gUnimplementedUPP == (Ptr) kUnresolvedCFragSymbolAddress)
		gUnimplementedUPP = GetToolboxTrapAddress(_Unimplemented);
Å@
	if ((Ptr) gPack2TrapUPP == (Ptr) kUnresolvedCFragSymbolAddress)
		gPack2TrapUPP = GetToolboxTrapAddress(0xA9E9);
Å@
	if ((Ptr) gPack2TrapUPP != (Ptr) gUnimplementedUPP)
	{
	private_result = CallUniversalProc(gPack2TrapUPP,
		kStackDispatchedPascalStackBased |
			RESULT_SIZE(SIZE_CODE(sizeof(OSErr))) |
			DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kTwoByteCode) |
			DISPATCHED_STACK_ROUTINE_PARAMETER(1,
				SIZE_CODE(sizeof(short))) |
			DISPATCHED_STACK_ROUTINE_PARAMETER(2,
				SIZE_CODE(sizeof(Boolean))) |
			DISPATCHED_STACK_ROUTINE_PARAMETER(3,
				SIZE_CODE(sizeof(unsigned long))) |
			DISPATCHED_STACK_ROUTINE_PARAMETER(4,
				SIZE_CODE(sizeof(unsigned long))),
		0x000C,				// selector
		drvNum, fmtFlag, fmtArg, actSize);	// parameter(s)
	}
	return (OSErr) private_result;
}
Å@
pascal OSErr DIXZero(short drvNum, ConstStr255Param volName,
	short fsid, short mediaStatus, short volTypeSelector,
	unsigned long volSize, void *extendedInfoPtr)
// THREEWORDINLINE(0x700E, 0x3F00, 0xA9E9);
//		MOVEQ	#$0E,D0		| 700E
//		MOVE.W	D0,-(A7)	| 3F00
//		_Pack2				| A9E9
{
	long	private_result = unimpErr;	// ñ¢é¿ëïÇà A ÉgÉâÉbÉvÇâºíË
Å@
	if ((Ptr) gUnimplementedUPP == (Ptr) kUnresolvedCFragSymbolAddress)
		gUnimplementedUPP = GetToolboxTrapAddress(_Unimplemented);
Å@
	if ((Ptr) gPack2TrapUPP == (Ptr) kUnresolvedCFragSymbolAddress)
		gPack2TrapUPP = GetToolboxTrapAddress(0xA9E9);
Å@
	if ((Ptr) gPack2TrapUPP != (Ptr) gUnimplementedUPP)
	{
	private_result = CallUniversalProc(gPack2TrapUPP,
		kStackDispatchedPascalStackBased |
			RESULT_SIZE(SIZE_CODE(sizeof(OSErr))) |
			DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kTwoByteCode) |
			DISPATCHED_STACK_ROUTINE_PARAMETER(1,
				SIZE_CODE(sizeof(short))) |
			DISPATCHED_STACK_ROUTINE_PARAMETER(2,
				SIZE_CODE(sizeof(ConstStr255Param))) |
			DISPATCHED_STACK_ROUTINE_PARAMETER(3,
				SIZE_CODE(sizeof(short))) |
			DISPATCHED_STACK_ROUTINE_PARAMETER(4,
				SIZE_CODE(sizeof(short))) |
			DISPATCHED_STACK_ROUTINE_PARAMETER(5,
				SIZE_CODE(sizeof(short))) |
			DISPATCHED_STACK_ROUTINE_PARAMETER(6,
				SIZE_CODE(sizeof(unsigned long))) |
			DISPATCHED_STACK_ROUTINE_PARAMETER(7,
				SIZE_CODE(sizeof(void *))),
		0x000E,						// selector
		drvNum, volName, fsid, mediaStatus,		// parameter(s)
		volTypeSelector, volSize, extendedInfoPtr);
	}
	return (OSErr) private_result;
}
Å@
pascal OSErr DIReformat(short drvNum, short fsid,
				ConstStr255Param volName, ConstStr255Param msgText)
// THREEWORDINLINE(0x7010, 0x3F00, 0xA9E9);
//		MOVEQ	#$10,D0		| 7010
//		MOVE.W	D0,-(A7)	| 3F00
//		_Pack2				| A9E9
{
	long	private_result = unimpErr;	// ñ¢é¿ëïÇà A ÉgÉâÉbÉvÇâºíË
Å@
	if ((Ptr) gUnimplementedUPP == (Ptr) kUnresolvedCFragSymbolAddress)
		gUnimplementedUPP = GetToolboxTrapAddress(_Unimplemented);
Å@
	if ((Ptr) gPack2TrapUPP == (Ptr) kUnresolvedCFragSymbolAddress)
		gPack2TrapUPP = GetToolboxTrapAddress(0xA9E9);
Å@
	if ((Ptr) gPack2TrapUPP != (Ptr) gUnimplementedUPP)
	{
	private_result = CallUniversalProc(gPack2TrapUPP,
		kStackDispatchedPascalStackBased |
			RESULT_SIZE(SIZE_CODE(sizeof(OSErr))) |
			DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kTwoByteCode) |
			DISPATCHED_STACK_ROUTINE_PARAMETER(1,
				SIZE_CODE(sizeof(short))) |
			DISPATCHED_STACK_ROUTINE_PARAMETER(2,
				SIZE_CODE(sizeof(short))) |
			DISPATCHED_STACK_ROUTINE_PARAMETER(3,
				SIZE_CODE(sizeof(ConstStr255Param))) |
			DISPATCHED_STACK_ROUTINE_PARAMETER(4,
				SIZE_CODE(sizeof(ConstStr255Param))),
		0x0010,				// selector
		drvNum, fsid, volName, msgText);	// parameter(s)
	}
	return (OSErr) private_result;
}

äÆëSÇ»ÉTÉìÉvÉã: ControlStrip

/*
 	File:		ControlStrip.Glue.c
 
 	Copyright:	© 1984-1997 by Apple Computer, Inc.
 				All rights reserved.
*/
Å@
#include <MixedMode.h>
#include <ControlStrip.h>
Å@
static UniversalProcPtr gControlStripTrapUPP = kUnresolvedCFragSymbolAddress;
static UniversalProcPtr gUnimplementedUPP = kUnresolvedCFragSymbolAddress;
Å@
#define _ControlStripDispatch 0xAAF2
Å@
pascal Boolean SBIsControlStripVisible(void)
// TWOWORDINLINE(0x7000, 0xAAF2);
//	MOVEQ	#$00,D0
//	_ControlStripDispatch
{
	long	private_result = 0L;
Å@
	if ((Ptr) gUnimplementedUPP == (Ptr) kUnresolvedCFragSymbolAddress)
		gUnimplementedUPP = 
			GetToolboxTrapAddress(_Unimplemented);
Å@
	if ((Ptr) gControlStripTrapUPP == (Ptr) kUnresolvedCFragSymbolAddress)
		gControlStripTrapUPP = 
			GetToolboxTrapAddress(_ControlStripDispatch);
Å@
	if ((Ptr) gControlStripTrapUPP != (Ptr) gUnimplementedUPP)
	{
		private_result = CallUniversalProc(gControlStripTrapUPP,
			kD0DispatchedPascalStackBased |
				DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kTwoByteCode) |
				RESULT_SIZE(SIZE_CODE(sizeof(Boolean))),
			0x0000);	// selector
	}
	return (Boolean) private_result;
}
Å@
pascal void SBShowHideControlStrip(Boolean showIt)
// THREEWORDINLINE(0x303C, 0x0101, 0xAAF2);
//	MOVE.W	#$0101,D0
//	_ControlStripDispatch
{
	if ((Ptr) gUnimplementedUPP == (Ptr) kUnresolvedCFragSymbolAddress)
		gUnimplementedUPP = GetToolboxTrapAddress(_Unimplemented);
Å@
	if ((Ptr) gControlStripTrapUPP == (Ptr) kUnresolvedCFragSymbolAddress)
		gControlStripTrapUPP = GetToolboxTrapAddress(_ControlStripDispatch);
Å@
	if ((Ptr) gControlStripTrapUPP != (Ptr) gUnimplementedUPP)
	{
		CallUniversalProc(gControlStripTrapUPP,
			kD0DispatchedPascalStackBased |
			DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kTwoByteCode) |
			DISPATCHED_STACK_ROUTINE_PARAMETER(1,
				SIZE_CODE(sizeof(Boolean))),
			0x0101,	// selector
			showIt);	// parameter(s)
	}
}

äÆëSÇ»ÉTÉìÉvÉã: Power Manager

/*
 	File:		Power.Glue.c
 
 	Copyright:	© 1984-1997 by Apple Computer, Inc.
 				All rights reserved.
*/
Å@
#include <MixedMode.h>
#include <Power.h>
Å@
static UniversalProcPtr gPowerTrapUPP = kUnresolvedCFragSymbolAddress;
static UniversalProcPtr gUnimplementedUPP = kUnresolvedCFragSymbolAddress;
Å@
pascal Boolean HardDiskPowered(void)
// TWOWORDINLINE(0x7006, 0xA09E);
//	MOVEQ	#$06,D0		| 7006	; Move selector
//	_PowerMgr			| A09E	; for _HardDiskPowered
{
	long	private_result = 0L;
Å@
	if ((Ptr) gUnimplementedUPP == (Ptr) kUnresolvedCFragSymbolAddress)
		gUnimplementedUPP = GetToolboxTrapAddress(_Unimplemented);
Å@
	if ((Ptr) gPowerTrapUPP == (Ptr) kUnresolvedCFragSymbolAddress)
		gPowerTrapUPP = GetToolboxTrapAddress(0xA09E);
Å@
	if ((Ptr) gPowerTrapUPP != (Ptr) gUnimplementedUPP)
	{
		private_result = CallUniversalProc(gPowerTrapUPP,
			kD0DispatchedPascalStackBased |
				DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kTwoByteCode) |
				RESULT_SIZE(SIZE_CODE(sizeof(Boolean))),
			0x0006);	// selector
	}
	return (OSErr) private_result;
}
Å@
pascal void SpinDownHardDisk(void)
// TWOWORDINLINE(0x7007, 0xA09E);
//	MOVEQ	#$07,D0		| 7006	; Move selector
//	_PowerMgr			| A09E	; for _SpinDownHardDisk
{
	if ((Ptr) gUnimplementedUPP == (Ptr) kUnresolvedCFragSymbolAddress)
		gUnimplementedUPP = GetToolboxTrapAddress(_Unimplemented);
Å@
	if ((Ptr) gPowerTrapUPP == (Ptr) kUnresolvedCFragSymbolAddress)
		gPowerTrapUPP = GetToolboxTrapAddress(0xA09E);
Å@
	if ((Ptr) gPowerTrapUPP != (Ptr) gUnimplementedUPP)
	{
		CallUniversalProc(gPowerTrapUPP,
			kD0DispatchedPascalStackBased |
				DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kTwoByteCode),
			0x0007);	// selector
	}
}
Å@
pascal Boolean IsSpindownDisabled(void)
// TWOWORDINLINE(0x7008, 0xA09E);
//	MOVEQ	#$08,D0		; Move selector
//	_PowerMgr			; for _IsSpindownDisabled
{
	long	private_result = 0L;
Å@
	if ((Ptr) gUnimplementedUPP == (Ptr) kUnresolvedCFragSymbolAddress)
		gUnimplementedUPP = GetToolboxTrapAddress(_Unimplemented);
Å@
	if ((Ptr) gPowerTrapUPP == (Ptr) kUnresolvedCFragSymbolAddress)
		gPowerTrapUPP = GetToolboxTrapAddress(0xA09E);
Å@
	if ((Ptr) gPowerTrapUPP != (Ptr) gUnimplementedUPP)
	{
		private_result = CallUniversalProc(gPowerTrapUPP,
			kD0DispatchedPascalStackBased |
			DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kTwoByteCode) |
			RESULT_SIZE(SIZE_CODE(sizeof(Boolean))),
			0x0008);	// selector
	}
	return (OSErr) private_result;
}
Å@
// DZÇÍÇÁ 2 ǬÇà API ÇÕ A ÉgÉâÉbÉvÇ≈ D0 ÇÃè„à ÉèÅ[ÉhÇ…ò_óùílÇì¸ÇÍǃìnÇ∑
// ÇΔǢǧïœë•ìIǻLJÇÃÇ≈Ç∑ÅBâ∫à ÉèÅ[ÉhÇ…ÇÕÉZÉåÉNÉ^Ç™ì¸ÇËÇ‹Ç∑ÅB
//  (ïœÇ≈Ç∑ÇÀ)
Å@
pascal void SetSpindownDisable(Boolean setDisable)
// FOURWORDINLINE(0x4840, 0x303C, 0x0009, 0xA09E);
//	SWAP	D0		; Move setDisable to high-Word of D0
//	MOVE.W	#$0009,D0	; Move selector to low-Word of D0
//	_PowerMgr		; for _SetSpindownDisable
{
	if ((Ptr) gUnimplementedUPP == (Ptr) kUnresolvedCFragSymbolAddress)
		gUnimplementedUPP = GetToolboxTrapAddress(_Unimplemented);
Å@
	if ((Ptr) gPowerTrapUPP == (Ptr) kUnresolvedCFragSymbolAddress)
		gPowerTrapUPP = GetToolboxTrapAddress(0xA09E);
Å@
	if ((Ptr) gPowerTrapUPP != (Ptr) gUnimplementedUPP)
		CallUniversalProc(gPowerTrapUPP,
			kD0DispatchedPascalStackBased |
				DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kTwoByteCode),
			(setDisable << 16) | 0x0009);	// selector
}
Å@
pascal void AutoSleepControl(Boolean enableSleep)
// FOURWORDINLINE(0x4840, 0x303C, 0x000D, 0xA09E);
//	SWAP	D0		; Move setDisable to high-Word of D0
//	MOVE.W	#$000D,D0	; Move selector to low-Word of D0
//	_PowerMgr		; for _AutoSleepControl
{
	if ((Ptr) gUnimplementedUPP == (Ptr) kUnresolvedCFragSymbolAddress)
		gUnimplementedUPP = GetToolboxTrapAddress(_Unimplemented);
Å@
	if ((Ptr) gPowerTrapUPP == (Ptr) kUnresolvedCFragSymbolAddress)
		gPowerTrapUPP = GetToolboxTrapAddress(0xA09E);
Å@
	if ((Ptr) gPowerTrapUPP != (Ptr) gUnimplementedUPP)
		CallUniversalProc(gPowerTrapUPP,
			kD0DispatchedPascalStackBased |
				DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kTwoByteCode),
			(enableSleep << 16) | 0x000D);	// selector
}

óvñÒ

DZÇÍÇ≈ÅAInterfaceLib Ç©ÇÁåáóéǵǃǢÇÈÉãÅ[É`ÉìÇ∑Ç◊ǃÇÃÉOÉãÅ[ÇèëÇ≠ï˚ñ@Çè–âÓǵNjǵÇΩÇ©ÇÁÅALJǧåæÇ¢ñÛÇÕÇ≈Ç´Ç‹ÇπÇÒÇÀÅBç°Ç±ÇªÅAÇ∑ÇŒÇÁǵǢ CFM ÉAÉvÉäÉPÅ[ÉVÉáÉìÇèëÇ≠Ç◊Ç´ÇΔÇ´Ç≈Ç∑ÅB

Å@

éQçlï∂å£

  • ÅwInside Macintosh: PowerPC System SoftwareÅxÇÃëÊ 2 èÕÅuMixed Mode ManagerÅv
  • Joe Zobkiw íòÅwA Fragment of Your ImaginationÅx (ISBN:0-201-48358)